#include <stdio.h>

int main(int argc, char** argv){
    printf("Hello world");
    return 0;
//1.一维数组
int a[]={1,2,3,4};
    printf("%d\n",sizeof(a));//16 表示整个数组长度，4*4=16
    printf("%d\n",sizeof(a+0));//4/8 a+0既不是sizeof(数组名)，也不是&数组名，故a表示首元素地址
    printf("%d\n",sizeof(*a));// 4此时a表示首元素地址，*a是首元素
    printf("%d\n",sizeof(a+1));// 4/8 a＋1表示第二个元素地址
    printf("%d\n",sizeof(a[1]));  //4
    printf("%d\n",sizeof(&a));// 4/8
    printf("%d\n",sizeof(*&a));//&a取出整个数组地址，*&a对其进行解引用操作，表示整个数组
    printf("%d\n",sizeof(&a[0]));//4/8数组首元素地址
    printf("%d\n",sizeof(&a+1));// 4/8表示跳过整个数组后的地址，但还是地址
//2.字符数组
char arr[]={'a','b','c','d','e','f'};
    printf("%d\n",sizeof(arr));//6
    printf("%d\n",sizeof(arr+0));//4/8
    printf("%d\n",sizeof(*arr));//1表示首元素的大小
    printf("%d\n",sizeof(arr[1]));//1表示第二个元素大小
    printf("%d\n",sizeof(&arr));//4/8
    printf("%d\n",sizeof(&arr+1));//跳过整个数组的地址
    printf("%d\n",sizeof(&arr[0]+1));//是第二个元素的地址
char arr[]={'a','b','c','d','e','f'};
    printf("%d\n",strlen(arr));//随机arr是首元素地址在，\0位置未知
    printf("%d\n",strlen(arr+0));//随机是首元素地址，\0位置未知
    printf("%d\n",strlen(*arr));//'err接收'a'97
    printf("%d\n",strlen(arr[1]));//err接收'b'的98
    printf("%d\n",strlen(&arr));//随机 从首元素开始计算直到遇见\0
    printf("%d\n",strlen(&arr+1));//随机 接收跳过一个数组后的地址开始计算
    printf("%d\n",strlen(&arr[0]+1));//随机 从第二个元素开始计算直到遇见\0
    
char arr[]="abcdef";
    printf("%d\n",sizeof(arr));// 7
    printf("%d\n",sizeof(arr+0)); //4/8不是sizeof(arr),也不是&arr,表示首元素地址
    printf("%d\n",sizeof(*arr)); //1不是sizeof(arr),也不是&arr,表示首元素地址arr指首元素
    printf("%d\n",sizeof(arr[1]));//1=*(arr+1)不是sizeof(arr),也不是&arr,表示首元素地址arr指首元素,arr+1表示第二个元素
    printf("%d\n",sizeof(&arr));//4/8 &arr是整个数组的地址
    printf("%d\n",sizeof(&arr+1));//4/8 表示跳过整个数组后的地址
    printf("%d\n",sizeof(&arr[0]+1));//4/8第二个元素地址
    char arr[]="abcdef"
    printf("%d\n",strlen(arr));//6遇到\0停止
    printf("%d\n",strlen(arr+0));//6遇到\0停止
    printf("%d\n",strlen(*arr));//err'a'接收97,无法识别
    printf("%d\n",strlen(arr[1]));//err'b'接收98,无法识别
    printf("%d\n",strlen(&arr));//err随机有告警&arr是指整个数组的地址，需存放在数组指针中，char(*p)[7]=&arr,其参数类型为char(*)[7],而strlen的参数类型为const char*,类型不同
    printf("%d\n",strlen(&arr+1));//随机
    printf("%d\n",strlen(&arr[0]+1));//5指从第二个元素开始计算,遇见\0停止
    
    char*p="abcdef";
    printf("%d\n",sizeof(p));//4/8计算指针变量p的大小
    printf("%d\n",sizeof(p+1));//4/8得到b的地址
    printf("%d\n",sizeof(*p));//1字符串第一个字符'a'
    printf("%d\n",sizeof(p[0]));//1p[0]=*(p+0)='a'
    printf("%d\n",sizeof(&p));//4/8指针大小
    printf("%d\n",sizeof(&p+1));//4/8指针大小
    printf("%d\n",sizeof(&p[0]+1));//4/8指针大小
    char*p="abcdef";
    printf("%d\n",strlen(p));//6遇到\0停止
    printf("%d\n",strlen(p+1));//5遇到\0停止
    printf("%d\n",strlen(*p));//err接收97('a')
    printf("%d\n",strlen(p[0]));//err接收97('a')
    printf("%d\n",strlen(&p));//随机p中储存a的地址,地址中/0位置未知
    printf("%d\n",strlen(&p+1));//随机p中储存a的地址,地址中/0位置未知
    printf("%d\n",strlen(&p[0]+1));//5从b开始计算
    
//二维数组
        int a[3][4]={0,1,2};
        printf("%d\n",sizeof(a));//  48,3*4*4=48
        printf("%d\n",sizeof(a[0][0]));//4第一行第一个元素
        printf("%d\n",sizeof(a[0]));//16 4*4=16a[0]是第一行元素,相当于一维数组的数组名，计算第一行大小
        printf("%d\n",sizeof(a[0]+1));//4/8此时a[0]表示第一行首元素,+1表示第一行第二个元素地址
        printf("%d\n",sizeof(*(a[0]+1)));//4表示第一行第二个元素
        printf("%d\n",sizeof(a+1));//4/8 a是二维数组名，没有sizeof(数组名),也无&数组名故a为首元素地址，二维数组首元素为第一行，a＋1表示第二行元素地址
        printf("%d\n",sizeof(*(a+1)));//16=sizeof(a[1])计算第二行大小
        printf("%d\n",sizeof(&a[0]+1));//4/8&a[0]是第一行,&a[0]+1是第二行地址
        printf("%d\n",sizeof(*(&a[0]+1)));//16第二行元素
        printf("%d\n",sizeof(*a));//16没有sizeof(a),也没有&a,a为首元素,二维首元素是第一行
        printf("%d\n",sizeof(a[3]));//16sizeof不会真实访问第四行，只根据元素类型大小推断
        